package alejandro.celulares
import scala.collection.mutable.ListBuffer
import java.sql.Time

class PlanDePago {

    var numerosAmigos = new Array[Long](5)
    def esNumeroAmigo(numeroAmigoP: Long):Boolean = {
      numerosAmigos.contains(numeroAmigoP)
    }
	def setNumerosAmigo(numeroAmigoP: Long, posicion: Integer) = {
	    numerosAmigos(posicion - 1) = numeroAmigoP
	}
  
    var ciudadAmiga: Localidad = _
    def getCiudadAmiga():Localidad = ciudadAmiga
	def setCiudadAmiga(ciudadAmigaP: Localidad) = {
	    ciudadAmiga = ciudadAmigaP
	}
    
    def montoFacturaConDescuentos(
          msjtxt:ListBuffer[MensajeDeTexto],
          llamLc:ListBuffer[LlamadaLocal],
          llamLg:ListBuffer[LlamadaLarga]
          ): BigDecimal = {
      
      var llamLgVar = aplicarFiltroPreInternacional(
                      aplicarFiltroHablaTodo(
                      aplicarFiltroAmigos(
                      aplicarFiltroCiudades(llamLg))))
                      
      var llamLcVar = aplicarFiltroPreLocal(
                      aplicarFiltroHablaTodo(
                      aplicarFiltroAmigos(llamLc)))
      
      var comunicaciones = Comunicacion.joinComunicaciones(msjtxt, llamLc, llamLgVar)      
      var listadoPrecios: ListBuffer[BigDecimal] = comunicaciones.map{com => com.precioComunicacion()}
	  var cero: BigDecimal = 0.0
	  listadoPrecios.foldLeft(cero)((b, a) => (b + a)) + costoDescuentos()
    }
    
    def costoDescuentos(): BigDecimal = {
      0.0
    }
    
    def aplicarFiltroCiudades(llamLg: ListBuffer[LlamadaLarga]): ListBuffer[LlamadaLarga] ={
      //Do nothing
      llamLg
    }
    def aplicarFiltroAmigos[T <: Comunicacion](llamLg: ListBuffer[T]): ListBuffer[T] ={
      //Do nothing
      llamLg
    } 
    
    def aplicarFiltroHablaTodo[T <: LlamadaLocal](llamLg: ListBuffer[T]): ListBuffer[T] ={
      //Do nothing
      llamLg
    } 
    
    def aplicarFiltroPreInternacional(llamLg: ListBuffer[LlamadaLarga]): ListBuffer[LlamadaLarga] ={
      //Do nothing
      llamLg
    } 
    
    def aplicarFiltroPreLocal(llamLg: ListBuffer[LlamadaLocal]): ListBuffer[LlamadaLocal] ={
      //Do nothing
      llamLg
    } 
    
    
}

trait Descuento extends PlanDePago{ 
    def descontarMinutos[T <: LlamadaLocal](minutos: Integer, llamadas: ListBuffer[T]):ListBuffer[T] = {
      //TODO falta descontar los minutos gratis
      llamadas
    }
}

trait DescuentoCiudades extends Descuento{
    override def aplicarFiltroCiudades(llamLg: ListBuffer[LlamadaLarga]): ListBuffer[LlamadaLarga] ={
      var noCoinciden = llamLg.collect{case lmlg if !getCiudadAmiga.equals(lmlg.getLocDestino()) => lmlg}
      noCoinciden
    }
    override def costoDescuentos(): BigDecimal = {
      super.costoDescuentos() + 10.0
    }  
}

trait DescuentoAmigos extends Descuento{
    override def aplicarFiltroAmigos[T <: Comunicacion](llamLg: ListBuffer[T]): ListBuffer[T] ={
      var noCoinciden = llamLg.collect{case lmlg if !esNumeroAmigo(lmlg.getNumeroDestino()) => lmlg}
      noCoinciden
    }  
    override def costoDescuentos(): BigDecimal = {
      super.costoDescuentos() + 10.0
    }   
}

trait DescuentoHablateTodo extends Descuento{
    override def aplicarFiltroHablaTodo[T <: LlamadaLocal](llamLg: ListBuffer[T]): ListBuffer[T] ={
      llamLg.foreach{com => 
        if(esFinDeSemana(com)){
          com.setDuracion(new Time(0, 5, 0))
        }        
      }
      llamLg
    }
    
    def esFinDeSemana[T <: LlamadaLocal](com: T): Boolean = {
      (com.getFecha().getDay() == 6) |  (com.getFecha().getDay() == 0)
      
    }   
    override def costoDescuentos(): BigDecimal = {
      super.costoDescuentos() + 10.0
    }  
}

trait DescuentoPreLocal extends Descuento{
    override def aplicarFiltroPreLocal(llamLc: ListBuffer[LlamadaLocal]): ListBuffer[LlamadaLocal] ={
      descontarMinutos(30, llamLc)
    }  
    override def costoDescuentos(): BigDecimal = {
      super.costoDescuentos() + 10.0
    }   
}

trait DescuentoPreInternacional extends Descuento{
    override def aplicarFiltroPreInternacional(llamLg: ListBuffer[LlamadaLarga]): ListBuffer[LlamadaLarga] ={
      descontarMinutos(30, llamLg)
    }  
    override def costoDescuentos(): BigDecimal = {
      super.costoDescuentos() + 10.0
    }   
}





